package symboltable; 
  
 import java.util.Enumeration; 
 import java.util.LinkedList; 
  
  
 public class SymbolTable { 
         public LinkedList<Class> classes; 
  
         public SymbolTable() { 
                 classes = new LinkedList<Class>(); 
         } 
  
         /** 
          * Insere uma classe na lista de classes da tabela de simbolo 
          *  
          * @param id - Nome da classe a se adicionar 
          * @param newClass - Classe a se adicionar 
          * @return - true se a classe ainda nao havia sido inserida. False, caso contrario 
          */ 
         public boolean addClass(String id, Class newClass) { 
                 if(hasClass(newClass)) 
                         return false; 
                  
                 classes.push(newClass); 
                 return true; 
         } 
  
         /** 
          * Faz uma busca na lista de classes da tabela de simbolo 
          * 
          * @param aClass - classe a se procurar 
          * @return - true, se a classe estiver na lista de classe. False, caso contrario 
          */ 
         public boolean hasClass(Class aClass) { 
                 for(Class c : classes) 
                         if(c.classId.equals(aClass.classId)) 
                                 return true; 
                 return false; 
         } 
  
         public boolean hasMethodInClass(Method aMethod, Class c) { 
                 // Para cada metodo na lista de metodos da classe c 
                 for(Enumeration<Symbol> e = c.methods.elements(); e.hasMoreElements();) 
                         if(e.nextElement().name.equals(aMethod.name)) 
                                 return true; 
                 return false; 
         } 
  
         public Class getClass(String name) { 
                 for(Class c : classes) 
                         if(c.classId.equals(name)) 
                                 return c; 
                 return null; 
         } 
  
         public boolean addMethodInClass(Method newMethod, Class aClass) { 
                 if(!hasClass(aClass)) 
                         return false; 
  
                 Class c = getClass(aClass.classId); 
                 if(hasMethodInClass(newMethod, c)) 
                         return false; 
  
                 c.methods.put(newMethod.name, newMethod); 
                 return true; 
         } 
 }  